<?php
/**
 * 工厂方法模式
 *
 * 与抽象工厂模式不同，原先由抽象类决定的具体实现的类现在由其子类决定
 *
 *
 * 优点：克服了抽象工厂模式难以添加新的具体实现类的缺点。
 */

//抽象工厂
abstract class AbstractFactory{
	//指定要创建的对象
	abstract public function getProduct();
}
//实现的产品抽象类
abstract class AbstractProduct{
	//产品例举的方法
	abstract public function TurnOn();
	abstract public function TurnOff();
}
//灯
class Light extends AbstractProduct{
	public function TurnOn()
	{
		echo "Light TurnOn\n";
	}
	public function TurnOff()
	{
		echo "Light TurnOff\n";
	}
}
//灯工厂
class LightFactory extends AbstractFactory
{
	public function getProduct()
	{
		return new Light();
	}
}
//收音机
class Radio extends AbstractProduct{
	public function TurnOn()
	{
		echo "Radio TurnOn\n";
	}
	public function TurnOff()
	{
		echo "Radio TurnOff\n";
	}
}
//收音机工厂
class RadioFactory extends AbstractFactory{
	public function getProduct()
	{
		return new Radio();
	}
}
//当前生产了灯，如果生产收音机，只需修改工厂即可。
$factory = new RadioFactory();
$product = $factory->getProduct();
$product->TurnOn();
$product->TurnOff();
